package com.sprouting.personal.model.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sprouting.personal.annotations.CheckLength;
import com.sprouting.personal.annotations.CheckNotNull;
import com.sprouting.personal.model.common.BaseModel;
import com.sprouting.personal.model.common.jsr.AddGroup;
import com.sprouting.personal.model.common.jsr.UpdGroup;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import java.util.Date;

/**
 * 家庭作业
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2023/7/14 14:33
 */
@TableName("ps_homework")
@Data
public class Homework extends BaseModel {

    /**
     * 主键
     */
    @TableId
    @CheckNotNull(message = "非法ID", groups = UpdGroup.class)
    @Null(message = "无效ID", groups = AddGroup.class)
    private String id;
    /**
     * 隶属用户ID
     * @see User#getId()
     */
    private String userId;
    /**
     * 家庭成员ID
     * @see MemberFamily#getId()
     */
    @CheckNotNull(message = "请选择作业所属家庭成员")
    private String memberFamilyId;
    /**
     * 作业名称
     */
    @CheckLength(min = 1, max = 600, message = "作业名称超过长度限制")
    @CheckNotNull(message = "请输入作业名称")
    private String name;
    /**
     * 作业说明
     */
    @CheckLength(max = 2000, message = "作业说明超过长度限制")
    private String remarks;
    /**
     * 作业是否可选，非强制
     * 作业是否必须要做完的，可选的作业是做完最好，不做也可以
     * @see com.sprouting.personal.interfaces.common.Constant.YesOrNo#YES 强制完成 默认
     */
    private Integer optional;
    /**
     * 作业类型;每天一次，一段时间完成，今天必须完成
     * @see com.sprouting.personal.interfaces.common.Constant.HomeworkType
     */
    @NotNull(message = "请选择作业类型")
    private Integer type;
    /**
     * 作业开始时间
     * 当天的当天开始
     * 一段时间点可能提前给数据的布置作业
     * 每天一次的可能也是从某个时间开始
     */
    @NotNull(message = "请选择作业开始时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private Date startTime;
    /**
     * 最近一次执行时间
     * 这个是补签该做作业的那天时间，比如2月1日开始的任务，2天一次，现在是2月10日，已完成了2月2日，现在补签的时间为4、6、8，而不是更新的时间
     * 如果出现多次没有补签的，则要依次补签
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private Date execTime;
    /**
     * 作业截止时间;每天的则无限时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private Date deadline;
    /**
     * 完成频率;几天一次
     */
    private Integer frequency;
    /**
     * 完成状态;未开始、进行中、已完成，拖欠，补交
     * @see com.sprouting.personal.interfaces.common.Constant.HomeworkStatus
     */
    private Integer status;
    /**
     * 评分标准;作业的评分标准和要求
     */
    private String scoringCriteria;
    /**
     * 布置该作业的教师姓名
     */
    private String assignHomework;
    /**
     * 家庭作业还是额外布置的
     * 额外作业一般指家长布置的
     * @see com.sprouting.personal.interfaces.common.Constant.YesOrNo#YES 是额外的，默认no 非额外
     */
    private Integer additional;
    /**
     * 学科类别
     * 从字典中获取
     * @see com.sprouting.personal.interfaces.common.Constant.RetainDictGroup
     */
    @CheckNotNull(message = "请选择学科类别")
    private String subject;
    /**
     * 难度系数 五颗星
     */
    private Integer difficulty;
    /**
     * 知识点
     */
    private String knowledgePoints;
    /**
     * 作业评价
     */
    private String evaluate;
    /**
     * 作业是否已检查
     * @see com.sprouting.personal.interfaces.common.Constant.HomeworkCheck
     */
    private Integer checkHomework;
}
